#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

#define MAX_SIZE 100  // 栈的最大容量
typedef int ElemType; // 栈中元素的类型

// 顺序栈结构体
typedef struct {
    ElemType data[MAX_SIZE]; // 存储栈元素的数组
    int top;                 // 栈顶指针（索引），-1 表示栈空
} SeqStack;

// 初始化栈
void InitStack(SeqStack *stack) {
    stack->top = -1; // 栈空时，栈顶指针为 -1
}

// 判断栈是否为空
bool IsEmpty(SeqStack *stack) {
    return stack->top == -1;
}

// 判断栈是否已满
bool IsFull(SeqStack *stack) {
    return stack->top == MAX_SIZE - 1;
}

// 入栈（push）
bool Push(SeqStack *stack, ElemType e) {
    if (IsFull(stack)) {
        printf("栈已满，无法入栈！\n");
        return false;
    }
    stack->top++;               // 栈顶指针上移
    stack->data[stack->top] = e; // 新元素放入栈顶
    return true;
}

// 出栈（pop）
bool Pop(SeqStack *stack, ElemType *e) {
    if (IsEmpty(stack)) {
        printf("栈为空，无法出栈！\n");
        return false;
    }
    *e = stack->data[stack->top]; // 取出栈顶元素
    stack->top--;                 // 栈顶指针下移
    return true;
}

// 获取栈顶元素（不弹出）
bool GetTop(SeqStack *stack, ElemType *e) {
    if (IsEmpty(stack)) {
        printf("栈为空，无栈顶元素！\n");
        return false;
    }
    *e = stack->data[stack->top]; // 仅获取栈顶元素
    return true;
}

// 销毁栈（顺序栈无需手动释放内存，仅重置栈顶即可）
void DestroyStack(SeqStack *stack) {
    stack->top = -1;
}

// 测试代码
int main() {
    SeqStack stack;
    InitStack(&stack);

    // 入栈
    Push(&stack, 10);
    Push(&stack, 20);
    Push(&stack, 30);

    // 获取栈顶元素
    ElemType topVal;
    if (GetTop(&stack, &topVal)) {
        printf("栈顶元素：%d\n", topVal); // 输出：30
    }

    // 出栈
    ElemType popVal;
    while (Pop(&stack, &popVal)) {
        printf("出栈元素：%d\n", popVal); // 依次输出：30、20、10
    }

    return 0;
}